﻿using System;

namespace _17___面向对象___属性
{
    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            //person.BloodType = "AA";
        }

    }


    /// <summary>
    /// 人
    /// </summary>
    class Person
    {
        // 概念性的，需要强记 ，同时也可以跟现实中的人进行类比
        //Person 的成员，成员又包括：字段、属性、方法（能力、行为）
        // 函数 = 方法 

        // 字段
        private int age; //年龄
        public Sex sex; //性别

        // 属性 ： 可以提供对赋值进行判断和限定
        // 约定：字段对内，属性对外
        // 变量名称规则：约定只要是属性，以大写字母开头
        //  get ： 获得
        // set : 设置
        // return : 返回
        // value : 值 （根据申明的数据类型不同而不同）
        // 如果不是自动属性，就需要配合字段，例如本示例
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if (value < 0)
                {
                    Console.WriteLine($"输入的年龄有点诡异，重置为 0 ");
                    value = 0;
                }
                else if (value > 200)
                {
                    Console.WriteLine($"输入的年龄好像有点大的离谱！");
                    value = 120;
                }
                age = value; //把年纪拿捏的死死的
            }
        }



        // 自动属性：
        // 1.快捷输入 prop+ tab*2
        // 2. 结构: 直接 get set 用 分号隔开
        // 3.  可以赋初始值
        // 4. 只读属性、可读可写、只能写 ：使用 private 关键字进行标识
        public string Name { get; set; } = "地球人"; //可读可写

        /// <summary>
        /// 血型 ： A、 B、 ab、 O、 熊猫血 ...
        /// <remarks>因为血型由基因决定，一出生就固定不可修改，所以是 只读 属性</remarks>
        /// </summary>
        public string BloodType { get; private set; } = "A"; // set 访问器不可访问： 对外 的 只读

        public string BloodTypeType { get; } = "A"; //干脆剔除 set ： 只读
        public string BloodTypeV3 => "DD"; // （lambda 的写法）方法的表达式主体
        /// <summary>
        /// 记忆
        /// <para>记忆可以通过一起经历一些事情而写入他人的记忆中，但是他人的记忆你却不能读取，也就是只写 属性</para>
        /// 
        /// </summary>
        public string Memory { set; private get; } = "空白"; // get 访问器不可访问，对外意义只写属性
        //自动属性不存在 只写  状态，因为谁都访问不了，没有存在的意义，IDE 不合法，属性必须有 set 访问器
        // 自定义属性可以
        //public string MemoryV2{ set; } = "空白";

        string mmr;
        public string MemoryV3
        {
            set
            {
                mmr = value;
            }
        }

        public void MyBloodType()
        {
            Console.WriteLine(BloodTypeType);
            //BloodTypeType = "AA"; //只读属性 
            BloodType = "aa";
        }
        public void Foo()  //光标放在方法名称中间 alt+enter
        {
            Console.WriteLine($"{nameof(Person)}: ");
        }

    }
    /// <summary>
    /// 性别
    /// </summary>
    enum Sex
    {
        /// <summary>
        /// 男人
        /// </summary>
        Man,
        /// <summary>
        /// 女人
        /// </summary>
        Woman,
        /// <summary>
        /// 其他
        /// </summary>
        Other
    }

}
